课程主页:https://courses.cs.washington.edu/courses/cse351/16sp/

课程资料:

实验部分:https://github.com/vuquangtrong/HW-SW_Interface_Course

实验说明:https://courses.cs.washington.edu/courses/cse351/13sp/lab-0.html

课件:http://academictorrents.com/details/b63a566df824b39740eb9754e4fe4c0140306f4b

课程视频:https://www.bilibili.com/video/BV1Zt411s7Gg?from=search&seid=8781593976070799647

CMU课程完成了一半,接下来学习华盛顿大学的软硬件接口进行复习和巩固。

这次回顾第一部分,内存,数据和地址。

第一部分:内存,数据和地址

初步内容

CPU“内存”:寄存器和指令缓存

  • CPU中有固定数量的寄存器
    • 寄存器保存数据
  • CPU中有一个I-缓存,用于保存最近获取的指令
    • 如果执行适合高速缓存的循环,则CPU仅将这些指令转到内存一次,然后从高速缓存中执行这些指令

性能:不只是CPU速度

  • 数据和指令驻留在内存中
    • 要执行一条指令,必须将其提取到CPU中
    • 接下来,必须从内存中提取指令所操作的数据并带到CPU
  • CPU$\leftrightarrow$内存带宽可能会限制性能
    • 提升性能1:改良硬件以增加内存带宽(例如DDR→DDR2→DDR3)
    • 提高性能2:将更少的数据移入/移出CPU
      • 在CPU芯片本身中放入一些“内存”(这是“缓存”内存)

二进制表示

  • $2$进制表示
    • 将$351_{10}$表示为$0000000101011111_2$或$101011111_2$
  • 电子实现
    • 易于存储的双稳态元素
    • 可靠地通过嘈杂的电线传输

以位和字节表示信息

编码字节值

$1$字节等于$8$个二进制位。

  • 二进制:$00000000_{2}-11111111_{2}$
  • 十进制:$0_{10}-255_{10}$
  • 十六进制:${0 0}_{16}-\mathrm{FF}_{16}$

对应关系:

面向字节的内存组织

  • 程序指向地址
    • 从概念上讲,内存是一个非常大的字节数组,每个字节都有一个地址(索引)
    • 操作系统为每个“进程”提供专用的地址空间
      • 进程=正在执行的程序+它的数据+它的“状态”
      • 程序可以修改自己的数据,但不能修改其他数据
      • 破坏代码或“状态”通常会导致崩溃(或安全漏洞)
  • 编译器+运行时系统控制内存分配
    • 应该在哪里存储不同的程序对象
    • 所有分配都在一个地址空间内

机器字

  • 机器有“字长”
    • 整型数据的标称大小
      • 包括地址
    • 直到最近,大多数机器都使用32位(4字节)字
      • 将地址限制为4GB
      • 对于内存密集型应用程序而言变得太小
    • 当前大多数x86系统使用64位(8字节)字
      • 可能的地址空间:$2^{64} \approx 1.8 \times 10^{19}$字节
    • 为了向后兼容,许多CPU支持不同的字长
      • 字节数始终为2的幂:$1,2,4,8, \ldots$

面向字的内存组织

  • 地址指定内存中字节的位置
    • 字中第一个字节的地址
    • 连续字的地址相差4(32位)或8(64位)

组织和寻址内存中的数据

地址和指针

  • 地址是内存中的位置
  • 指针是包含地址的数据对象
    • 地址$0004$存储值$351$(或$15 \mathrm{F}_{16}$)
    • 存储在地址$\mathrm{001C}$的指针指向地址$0004$
    • 存储在地址$\mathrm{0024}$的指针指向地址$\mathrm{001C}$
    • 地址$0014$存储值$12$

数据表示

对象大小(以字节为单位)

字节顺序

  • 大端(PowerPC,Sun,Internet)
    • 大端优先:最高有效字节的地址最小
  • 小端(x86)
    • 小端优先:最低有效字节的地址最小
  • 例子
    • 变量具有4字节:$0 \mathrm x 01234567$
    • 变量的地址:$0\mathrm x100$

使用C语言处理内存中的数据

这部分主要是C语言的基本知识,这里从略。

布尔代数和位级操作

布尔代数

C中比特级运算

  • $\&, |, {\hat {} } , \sim$运算在C语言中可以使用

    • 效果是比特级的
  • 例子:

对比:C中逻辑运算

  • C中逻辑运算:${\&}{\&}, |, 1$

  • 例子:

表示和操纵集合

  • 比特向量可以表示集合
    • 长度为$w$的比特向量可以表示$\{0, \ldots, w-1\}$的子集
    • $a_{j}=1$如果$j \in A$
      • $01101001:\{0,3,5,6\}$
  • 操作:
    • $\&$:交集
    • $|$:并集
    • $\hat{}$:对称差
    • $\sim$ :补集